package k4_thread.demo10;

import java.util.ArrayList;

/**
 * 利用多线程求解某范围素数,每个线程负责 1000范围：
 * 线程1找1-1000；
 * 线程 2 找 1001-2000;
 * 线程 3 找 2001-3000。 编程程序将每个线程找到的素数集中
 * 打印。所有的素数输出完毕后，再输出素数的总数
 */
public class PrintPrime {

    ArrayList<Integer> primes = new ArrayList<>();

    int primeSum = 0;

    public synchronized void isPrime(int startNum,int endNum){
        for (int i = startNum; i <=endNum ; i++) {
            boolean flag = true;
            for (int j = 2; j <= i/2; j++) {
                //从1到数字的一半中，只要有一个数字能被整除，这个数字就不是素数
                if (i % j == 0) {
                    flag = false;
                    break;
                }
            }
            if(flag){
                primes.add(i);
                primeSum++;
            }
        }
    }

}

class Test{
    public static void main(String[] args) {

        PrintPrime prime = new PrintPrime();

        Thread t1 = new Thread(()->{
            prime.isPrime(1,100);
        });
        Thread t2 = new Thread(()->{
            prime.isPrime(101,200);
        });
        Thread t3 = new Thread(()->{
            prime.isPrime(201,300);
        });


        t1.start();
        t2.start();
        t3.start();

        try {
            t1.join();
            t2.join();
            t3.join();
        }catch (Exception e){
            e.printStackTrace();
        }

        ArrayList<Integer> primes = prime.primes;
        System.out.println(primes.size());
    }
}
